home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / error_handler.e < prev    next >
Text File  |  2000-03-25  |  6KB  |  234 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class ERROR_HANDLER
  17.    --
  18.    -- The unique `eh' object for Warning, Error and Fatal Error
  19.    -- handling.
  20.    -- This handler use an assynchronous strategy.
  21.    --
  22.  
  23. inherit GLOBALS;
  24.  
  25. feature
  26.  
  27.    error_counter, warning_counter: INTEGER;
  28.          -- Global counters.
  29.  
  30.    no_warning: BOOLEAN;
  31.  
  32. feature {NONE}
  33.  
  34.    explanation: STRING is
  35.          -- Current `explanation' text to be print with next Warning,
  36.          -- the next Error or the next Fatal Error.
  37.       once
  38.          !!Result.make(1024);
  39.       end;
  40.  
  41.    positions: FIXED_ARRAY[POSITION] is
  42.          -- The list of `positions' to be shown with next Warning,
  43.          -- the next Error or the next Fatal Error.
  44.       once
  45.          !!Result.with_capacity(8);
  46.       end;
  47.  
  48. feature
  49.  
  50.    is_empty: BOOLEAN is
  51.          -- True when nothing stored in `explanation' and `positions'.
  52.       do
  53.          Result := explanation.is_empty and then positions.is_empty;
  54.       end;
  55.  
  56.    set_no_warning is
  57.       do
  58.          no_warning := true;
  59.       end;
  60.  
  61. feature
  62.  
  63.    append(s: STRING) is
  64.       -- Append text `s' to the current `explanation'.
  65.       require
  66.          not s.is_empty
  67.       do
  68.          explanation.append(s);
  69.       ensure
  70.          not is_empty
  71.       end;
  72.  
  73.    extend(c: CHARACTER) is
  74.       -- Append `c' to the current `explanation'.
  75.       do
  76.          explanation.extend(c);
  77.       ensure
  78.          not is_empty
  79.       end;
  80.  
  81.    add_position(p: POSITION) is
  82.       -- If necessary, add `p' to the already known `positions'.
  83.       do
  84.          if p.is_unknown then
  85.          elseif positions.fast_has(p) then
  86.          else
  87.             positions.add_last(p);
  88.          end;
  89.       end;
  90.  
  91.    add_type(t: TYPE; tail: STRING) is
  92.       require
  93.          t /= Void
  94.       do
  95.          append("Type ");
  96.          if t.is_run_type then
  97.             append(t.run_time_mark);
  98.          else
  99.             append(t.written_mark);
  100.          end;
  101.          append(tail);
  102.          add_position(t.start_position);
  103.       end;
  104.  
  105.    feature_not_found(fn: FEATURE_NAME) is
  106.       require
  107.          fn /= Void
  108.       do
  109.          add_position(fn.start_position);
  110.          append(fz_09);
  111.          append(fn.to_string);
  112.          append(fz_not_found);
  113.       end;
  114.  
  115.    add_feature_name(fn: FEATURE_NAME) is
  116.       require
  117.          fn /= Void
  118.       do
  119.          append(fn.to_string);
  120.          extend(':');
  121.          extend(' ');
  122.          add_position(fn.start_position);
  123.       end;
  124.  
  125.    print_as_warning is
  126.          -- Print `explanation' as a Warning report.
  127.          -- After printing, `explanation' and `positions' are reset.
  128.       require
  129.          not is_empty
  130.       do
  131.          if no_warning then
  132.             cancel;
  133.          else
  134.             do_print("Warning");
  135.          end;
  136.          warning_counter := warning_counter + 1;
  137.       ensure
  138.          not no_warning implies (warning_counter = old warning_counter + 1);
  139.       end;
  140.  
  141.    print_as_error is
  142.          -- Print `explanation' as an Error report.
  143.          -- After printing, `explanation' and `positions' are reset.
  144.       require
  145.          not is_empty
  146.       do
  147.          do_print("Error");
  148.          error_counter := error_counter + 1;
  149.          if error_counter >= 6 then
  150.             echo.w_put_string(fz_error_stars);
  151.             echo.w_put_string("Too many errors.%N");
  152.             die_with_code(exit_failure_code);
  153.          end;
  154.       ensure
  155.          error_counter = old error_counter + 1;
  156.       end;
  157.  
  158.    print_as_fatal_error is
  159.          -- Print `explanation' as a Fatal Error.
  160.          -- Execution is stopped after this call.
  161.       do
  162.          do_print("Fatal Error");
  163.          die_with_code(exit_failure_code);
  164.       end;
  165.  
  166.    cancel is
  167.       -- Cancel a prepared report without printing it.
  168.       do
  169.          explanation.clear;
  170.          positions.clear;
  171.       ensure
  172.          is_empty
  173.       end;
  174.  
  175. feature {NONE}
  176.  
  177.    do_print(heading: STRING) is
  178.       local
  179.          i, cpt: INTEGER;
  180.          cc, previous_cc: CHARACTER;
  181.       do
  182.          echo.w_put_string(fz_error_stars);
  183.          echo.w_put_string(heading);
  184.          echo.w_put_string(" : ");
  185.          from
  186.             i := 1;
  187.             cpt := 9 + heading.count;
  188.          until
  189.             i > explanation.count
  190.          loop
  191.             previous_cc := cc;
  192.             cc := explanation.item(i);
  193.             i := i + 1;
  194.             if cpt > 60 then
  195.                if cc = ' ' then
  196.                   echo.w_put_character('%N');
  197.                   cpt := 0;
  198.                elseif previous_cc = ',' then
  199.                   echo.w_put_character('%N');
  200.                   echo.w_put_character(cc);
  201.                   cpt := 1;
  202.                else
  203.                   echo.w_put_character(cc);
  204.                   cpt := cpt + 1;
  205.                end;
  206.             else
  207.                echo.w_put_character(cc);
  208.                inspect
  209.                   cc
  210.                when '%N' then
  211.                   cpt := 0;
  212.                else
  213.                   cpt := cpt + 1;
  214.                end;
  215.             end;
  216.          end;
  217.          echo.w_put_character('%N');
  218.          from
  219.             i := positions.lower;
  220.          until
  221.             i > positions.upper
  222.          loop
  223.             positions.item(i).show;
  224.             i := i + 1;
  225.          end;
  226.          cancel;
  227.          echo.w_put_string("------%N");
  228.       ensure
  229.          is_empty
  230.       end;
  231.  
  232. end -- ERROR_HANDLER
  233.  
  234.